//
// Description: 526. 优美的排列
// Created by Loading on 2021/8/16.
//

#include <bits/stdc++.h>

using namespace std;

// DFS 回溯
int countArrangement(int n) {
    int res = 0;
    // 访问数组，标记访问状态
    vector<int> visit(n);
    function<void(int)> dfs = [&](int index) {
        // 一种组合构造完毕
        if (index == n + 1) {
            ++res;
        } else {
            for (int i = 1; i <= n; ++i) {
                // 元素未被访问过，且满足整除条件
                if (visit[i - 1] == 0 && (i % index == 0 || index % i == 0)) {
                    // 访问状态置为 1
                    visit[i - 1] = 1;
                    // 递归向后走
                    dfs(index + 1);
                    // 回溯，访问状态置回 0
                    visit[i - 1] = 0;
                }
            }
        }
    };
    dfs(1);

    return res;
}

int main() {
    int n = 15;
    vector<int> vec(n);
    for (int i = 1; i <= n; ++i) {
        vec[i - 1] = i;
    }
    vector<int> v;
    for(auto &x : vec) {
        int res = countArrangement(x);
        v.emplace_back(res);
    }
    for(auto &x : v) {
        cout << x << " ";
    }
}